## 第02课 呼吸灯

### （1）项目介绍：

前面课程中，我们详细的介绍了通过代码控制LED亮灭，实现闪烁的效果。这节课我们使用PWM来控制LED亮度不断地变化，模拟我们呼吸的效果。

PWM是使用数字手段来控制模拟输出的一种手段。使用数字控制产生占空比不同的方波（一个不停在高电平与低电平之间切换的信号)来控制模拟输出。一般来说端口的输入电压只有两个0V与5V。如果想要改变灯的亮度怎么办呢个？有同学说串联电阻，对，这个方法是正确的。但是，如果想要得到不同的亮度，且在不同亮度之间来回变动怎么办呢？不可能不停地切换电阻吧。这种情况下就需要使用PWM了，那它是怎么控制的呢？

对于Arduino的数字端口电压输出只有LOW与HIGH两个，对应的就是0V与5V的电压输出，可以把LOW定义为0，HIGH定义为1，1秒内让Arduino输出500个0或者1的信号。如果这500个全部为1，那就是完整的5V，如果全部为0，那就是0V。如果010101010101这样输出，刚好一半，端口输出的平均电压就为2.5V了。这个和放映电影是一个道理，咱们所看的电影并不是完全连续的，它其实是每秒输出25张图片。在这种情况下，人的肉眼是分辨不出来的，看上去就是连续的了。PWM也是同样的道理，如果想要不同的电压，就控制0与1的输出比例控制就可以了。当然这和真实的连续输出还是有差别的，单位时间内输出的0,1信号越多，控制的就越精确。

![](media/image1.gif)

### （2）项目组件：

| keyes PLUS 开发板*1 | Keyes brick L298P 电机驱动扩展板 V1*1 | keyes 草帽LED白发红模块*1 |
| --- | --- | --- |
| <img src="media/image2.png" width="200"> | <img src="media/image3.png" width="200"> | <img src="media/image4.png" width="200"> |
| USB线*1 | 3Pin 双母头杜邦线*1 | 18650双节电池盒*1<br />（电池 *2自配） |
| <img src="media/image6.png" width="200"> | <img src="media/image7.jpg" width="200"> | <img src="media/image8.png" width="200"> |

### （3）接线图：

Arduino的PWM引脚在3，5，6，9，10，11,我们将LED接在D9脚上。

![](media/image10.png)

### （4）项目代码：

①在事件栏里拉出“Arduino启动”模块。

![](media/image11.png)

②在引脚栏拖出设置引脚输入/输出模块

![](media/image12.png)

③在变量类型栏中拖出声明全局变量模块并设置变量名为“i”

![](media/image13.png)

在控制栏拖出无限循环模块

![](media/image14.png)

然后再拖出重复执行直到模块

![](media/image15.png)

然后在重复执行里加运算栏的大于模块，然后在变量类型栏下拖出变量模块变量名为 i ，最后设置数字为254

![](media/image16.png)

在变量类型下做出设置变量加一的模块，并设置变量名为 i

![](media/image17.png)

在引脚栏下拖出设置引脚为PWM模块，并添加变量i为PWM值

![](media/image18.png)

在控制栏拖出延时模块，设置延时为0.005秒

![](media/image19.png)

再拖出重复执行直到模块

![](media/image20.png)

然后在重复执行里加运算栏的小于于模块，然后在变量类型栏下拖出变量模块变量名为 i ，最后设置数字为1

![](media/image21.png)

在变量类型下做出设置变量减一的模块，并设置变量名为 i

![](media/image22.png)

在引脚栏下拖出设置引脚为PWM模块，并添加变量i为PWM值

![](media/image23.png)

在控制栏拖出延时模块，设置延时为0.005秒

![](media/image24.png)

完整代码：


![](media/image25.png)

**（5）项目结果：**

上传代码到开发板代，完成后，我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程，而不是直接的亮灭，如同呼吸一般，均匀变化。

### （6）项目拓展：

我们不改变灯的脚位，只是改变程序里面delay的值，看看它如何改变渐变效果。

![](media/image26.png)

上传代码到开发板，看LED渐变的效果是不是慢了一些。